# _*_ encoding:utf-8 _*_

"""
继承ModelBackend, 自定义认证后端
"""

from django.contrib.auth.backends import ModelBackend
from users.models import User
from django.db.models import Q
from django.conf import settings

from meiduo_mall.utils.secret import SecretOauth


class UsernameMobileAuthBackend(ModelBackend):
    """自定义认证后端"""

    # 重写该方法，实现根据username过滤，或根据mobile过滤用户对象
    def authenticate(self, request, username=None, password=None, **kwargs):
        # 查找用户
        try:
            user = User.objects.get(Q(username=username) | Q(mobile=username))
        except User.DoesNotExist as e:
            # 如果抛出异常，说明账号有误，认证失败，返回None
            return None
        # 校验密码
        if not user.check_password(password):
            return None

        # 校验是否是管理员登录后台
        if request is None:
            if not user.is_staff:
                return None  # 用户身份认证失败，返回None

        # 认证成功返回用户对象
        return user


def generate_verify_email_url(request):
    """
        构造验证链接：verify_url
        功能：加密用户数据成token，拼接完整的验证链接 --> verify_url 返回
        参数：request请求对象  ---> 通过请求对象获取user用户对象
        返回值：完整的验证链接
    """
    # 1.user_id username email
    data_dict = {
        'user_id': request.user.id,
        'username': request.user.username,
        'email': request.user.email
    }
    # 2.将参数加密
    dumps_data = SecretOauth().dumps(data_dict)

    # 3.拼接 完整的激活路由
    verify_url = settings.EMAIL_VERIFY_URL + dumps_data

    return verify_url
